﻿Imports System.IO
Imports System.Text
Imports System.Security
Imports System.Security.Cryptography
Imports Infragistics.Win.UltraMessageBox

''' <summary>
''' Class chứa các method và thuộc tính dùng chung
''' </summary>
''' <remarks>Nguyễn Huy Thường added on 04/05/2011</remarks>
Public Class clscommon

    Private Shared DES As New TripleDESCryptoServiceProvider
    Private Shared MD5 As New MD5CryptoServiceProvider

    ''' <summary>
    ''' Biến lưu trạng thái hoạt động
    ''' </summary>
    ''' <remarks>Nguyễn Huy Thường added on 06/07/2012</remarks>
    Public Enum LoginStatus As Integer
        NotLoggedIn = 0
        LoggedIn = 1
    End Enum

    ''' <summary>
    ''' Biến lưu chức vụ của người sử dụng phần mềm
    ''' </summary>
    ''' <remarks>Nguyễn Huy Thường added on</remarks>
    Public Enum RoleName As Integer
        Director = 0
        StoreManager = 1
        SaleEmployee = 2
    End Enum

    ''' <summary>
    ''' Biến lưu trạng thái hoạt động hiện thời
    ''' </summary>
    ''' <remarks>Nguyễn Huy Thường added on 04/05/2011</remarks>
    Public Enum ActionMode As Integer
        View = 1
        Add = 2
        Edit = 3
    End Enum

    ''' <summary>
    ''' Biến lưu loại báo cáo
    ''' </summary>
    ''' <remarks>Nguyễn Huy Thường</remarks>
    Public Enum ReportType As Integer
        AvailableItem = 1
        AllItem = 2
    End Enum

    ''' <summary>
    ''' Biến lưu các giá trị để hiển thị trên message box
    ''' </summary>
    ''' <remarks>Nguyễn Huy Thường added on 04/05/2011</remarks>
    Public Shared info As New UltraMessageBoxInfo

    ''' <summary>
    ''' Biến quản lý việc hiển thị message box
    ''' </summary>
    ''' <remarks>Nguyễn Huy Thường added on 04/05/2011</remarks>
    Public Shared infoManager As New UltraMessageBoxManager

#Region "Method"

    ''' <summary>
    ''' Hàm kiểm tra kết nối đến website
    ''' </summary>
    ''' <returns>Trả lại true nếu phần mềm kết nối được đến website và ngược lại</returns>
    ''' <remarks>Nguyễn Huy Thường added on 07/07/2012</remarks>
    Public Shared Function IsConnectionAvailable() As Boolean
        Dim objUrl As New System.Uri("http://www.phongnguyen.vn/")
        Dim objWebReq As System.Net.WebRequest
        objWebReq = System.Net.WebRequest.Create(objUrl)
        Dim objResp As System.Net.WebResponse
        Try
            objResp = objWebReq.GetResponse
            objWebReq = Nothing
            Return True
        Catch ex As Exception
            objWebReq = Nothing
            Return False
        End Try
        objResp.Close()
    End Function

    ''' <summary>
    ''' Hàm kiểm tra kết nối đến database
    ''' </summary>
    ''' <returns>Trả lại true nếu kết nối được đến database và ngược lại</returns>
    ''' <remarks>Nguyễn Huy Thường added on 07/07/2012</remarks>
    Public Shared Function CheckConnection(ByVal connString As String) As Boolean
        Try
            Using sqlConn As New System.Data.SqlClient.SqlConnection(connString)
                sqlConn.Open()
                Return (sqlConn.State = ConnectionState.Open)
            End Using
        Catch ex As Exception
            ShowException(ex.Message)
            Return False
        End Try
    End Function

    ''' <summary>
    ''' Hàm mã hóa dữ liệu 1 chiều
    ''' </summary>
    ''' <param name="str">Dữ liệu cần mã hóa</param>
    ''' <returns>Trả lại dữ liệu sau khi đã mã hóa</returns>
    ''' <remarks>Nguyễn Huy Thường added on </remarks>
    Public Shared Function EncodingData(ByVal str As String) As String
        Dim x = New System.Security.Cryptography.MD5CryptoServiceProvider
        Dim bs() As Byte = System.Text.Encoding.UTF8.GetBytes(str)
        bs = x.ComputeHash(bs)
        Dim s As System.Text.StringBuilder = New System.Text.StringBuilder
        For Each b As Byte In bs
            s.Append(b.ToString("x2").ToLower())
        Next
        Dim encoded As String = (Convert.ToString(s)).ToUpper
        Return encoded
    End Function

    ''' <summary>
    ''' Hàm tạo MD5 Hash
    ''' </summary>
    ''' <param name="value">hàm muốn tạo md5 hash</param>
    ''' <returns>giá trị muốn tạo hash</returns>
    ''' <remarks>Nguyễn Huy Thường added on 08/07/2012</remarks>
    Public Shared Function MD5Hash(ByVal value As String) As Byte()
        Return MD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(value))
    End Function

    ''' <summary>
    ''' Hàm mã hóa dữ liệu 2 chiều
    ''' </summary>
    ''' <param name="str">Dữ liệu cần mã hóa</param>
    ''' <returns>Trả lại dữ liệu sau khi đã mã hóa</returns>
    ''' <remarks>Nguyễn Huy Thường added on </remarks>
    Public Shared Function EncodingData2(ByVal str As String) As String
        DES.Key = MD5Hash("FMSDB")
        DES.Mode = CipherMode.ECB
        Dim Buffer As Byte() = ASCIIEncoding.ASCII.GetBytes(str)
        Return Convert.ToBase64String(DES.CreateEncryptor().TransformFinalBlock(Buffer, 0, Buffer.Length))
    End Function

    ''' <summary>
    ''' Hàm giải mã dữ liệu được mã hóa theo kiểu DES
    ''' </summary>
    ''' <param name="encryptedString">Dữ liệu đã được mã hóa</param>
    ''' <returns>Trả lại dữ liệu đã được giải mã</returns>
    ''' <remarks>Nguyễn Huy Thường added on 08/07/2012</remarks>
    Public Shared Function DecodingData(ByVal encryptedString As String) As String
        DES.Key = MD5Hash("FMSDB")
        DES.Mode = CipherMode.ECB
        Dim Buffer As Byte() = Convert.FromBase64String(encryptedString)
        Return ASCIIEncoding.ASCII.GetString(DES.CreateDecryptor().TransformFinalBlock(Buffer, 0, Buffer.Length))
    End Function

    ''' <summary>
    ''' Sub hiển thị exception
    ''' </summary>
    ''' <param name="ex">Exception message</param>
    ''' <remarks>Nguyễn Huy Thường added on 04/05/2011</remarks>
    Public Shared Sub ShowException(ByVal ex As String)
        info.Text = ex
        info.Icon = MessageBoxIcon.Error
        info.Caption = Application.ProductName
        info.Buttons = MessageBoxButtons.OK
        infoManager.ShowMessageBox(info)
    End Sub

    ''' <summary>
    ''' Sub hiển thị thông tin
    ''' </summary>
    ''' <param name="infoMessage">Thông tin cần đưa đến người dùng</param>
    ''' <remarks>Nguyễn Huy Thường added on 04/05/2011</remarks>
    Public Shared Sub ShowInformation(ByVal infoMessage As String)
        info.Text = infoMessage
        info.Icon = MessageBoxIcon.Information
        info.Caption = Application.ProductName
        info.Buttons = MessageBoxButtons.OK
        infoManager.ShowMessageBox(info)
    End Sub

    ''' <summary>
    ''' Sub hiển thị câu hỏi
    ''' </summary>
    ''' <param name="question">Câu hỏi cho người dùng</param>
    ''' <returns>Trả lại câu trả lời của người dùng</returns>
    ''' <remarks>Nguyễn Huy Thường added on 04/06/2011</remarks>
    Public Shared Function ShowQuestion(ByVal question As String) As DialogResult
        info.Text = question
        info.Icon = MessageBoxIcon.Question
        info.Caption = Application.ProductName
        info.Buttons = MessageBoxButtons.YesNo
        Return (infoManager.ShowMessageBox(info))
    End Function

    ''' <summary>
    ''' Hàm kiểm tra tính hợp lệ của số lượng nhập vào
    ''' </summary>
    ''' <param name="txtQuantity">Số lượng nhập vào</param>
    ''' <returns>Trả lại true nếu hợp lệ và ngược lại</returns>
    ''' <remarks>Nguyễn Huy Thường added on 15/11/2010</remarks>
    Public Shared Function CheckQuantity(ByVal txtQuantity As String) As Boolean
        Dim quantity As Decimal
        Try
            quantity = Decimal.Parse(txtQuantity)
        Catch ex As Exception
            ShowInformation(My.Resources.QuantityError)
            Return False
        End Try
        If quantity < 0 Then
            ShowInformation(My.Resources.QuantityError)
            Return False
        Else
            Return True
        End If
    End Function

    ''' <summary>
    ''' Hàm kiểm tra tính hợp lệ của số tiền nhập vào
    ''' </summary>
    ''' <param name="txtMoney">Số tiền nhập vào</param>
    ''' <returns>Trả lại true nếu hợp lệ và ngược lại</returns>
    ''' <remarks>Nguyễn Huy Thường added on 15/11/2010</remarks>
    Public Shared Function CheckMoney(ByVal txtMoney As String) As Boolean
        Dim money As Decimal
        Try
            money = Decimal.Parse(txtMoney)
        Catch ex As Exception
            ShowInformation(My.Resources.MoneyError)
            Return False
        End Try
        If money < 0 Then
            ShowInformation(My.Resources.MoneyError)
            Return False
        Else
            Return True
        End If
    End Function

    ''' <summary>
    ''' Hàm đọc số tiền thành chữ
    ''' </summary>
    ''' <param name="money">Số tiền cần đọc</param>
    ''' <returns>Số tiền đã được đọc thành chữ</returns>
    ''' <remarks>Nguyễn Huy Thường added on 16/11/2010</remarks>
    Public Shared Function MoneyReader(ByVal money As Long) As String
        If money.ToString.Length > 12 Then
            'Kiem tra neu so nhap vao co nhieu hon 12 chu so
            ShowInformation("Hiện tại chương trình chỉ có thể đọc được số tiền có từ 12 chữ số trở xuống!")
            Return ""
        End If

        If money = 0 Then
            'Neu so nhap vao la 0
            Return "Không"
        End If

        Dim number(9) As String
        'Chuoi so tu 1 den 9
        number(1) = " một"
        number(2) = " hai"
        number(3) = " ba"
        number(4) = " bốn"
        number(5) = " năm"
        number(6) = " sáu"
        number(7) = " bảy"
        number(8) = " tám"
        number(9) = " chín"

        Dim digit(4) As String
        'Chuoi hang
        digit(2) = " nghìn"
        digit(3) = " triệu"
        digit(4) = " tỷ"

        Dim moneyText As String = ""
        Dim index As Byte = 1
        Dim underThoundsand As Integer
        Dim unit As Byte
        Dim ten As Byte
        Dim hundred As Byte

        While index < 5
            'Vong lap de xac dinh hang
            underThoundsand = money Mod 1000
            money = money \ 1000
            unit = underThoundsand Mod 10
            ten = underThoundsand \ 10 Mod 10
            hundred = underThoundsand \ 100

            If Len(moneyText) > 12 And underThoundsand <> 0 Then
                moneyText = digit(index) + ", " + moneyText
            End If

            If Len(moneyText) <= 12 And underThoundsand <> 0 Then
                moneyText = digit(index) + moneyText
            End If

            index = index + 1

            Select Case unit
                'Xac dinh hang don vi
                Case 1
                    If ten > 1 Then moneyText = " mốt" + moneyText Else moneyText = " một" + moneyText
                Case 5
                    If ten = 0 Then moneyText = " năm" + moneyText Else moneyText = " lăm" + moneyText
                    'Case 4
                    '    If Len(moneyText) > 1 Then moneyText = " tư" + moneyText Else moneyText = " bốn" + moneyText
                Case Else
                    moneyText = number(unit) + moneyText
            End Select

            Select Case ten
                'Xac dinh hang chuc
                Case 1
                    moneyText = " mười" + moneyText
                Case 0
                    If (money <> 0 Or hundred <> 0) And unit <> 0 Then moneyText = " linh" + moneyText
                Case Else
                    moneyText = number(ten) + " mươi" + moneyText
            End Select

            Select Case hundred
                'Xac dinh hang tram
                Case 0
                    If money <> 0 And (unit <> 0 Or ten <> 0) Then moneyText = " không trăm" + moneyText
                    If money <> 0 And index > 2 And underThoundsand = 0 And unit = 0 And ten = 0 And hundred = 0 And Len(moneyText) <= 12 Then moneyText = "" + moneyText
                Case Else
                    moneyText = number(hundred) + " trăm" + moneyText
            End Select
        End While
        ' Viet hoa chu cai dau tien
        Return UCase(Left(Trim(moneyText), 1)) + Right(moneyText, Len(Trim(moneyText)) - 1) + " đồng"
    End Function
#End Region
End Class
